export class DateUtil {

    /**
     * 格式化补零，例如 5 → 05
     * @param {number} n 数字
     * @returns {string} 补零后的字符串
     */
    static pad(n) {
        return n.toString().padStart(2, '0');
    }

    /**
     * 按照指定格式输出时间
     * 支持的占位符：yyyy、MM、dd、HH、mm、ss、SSS
     * @param {Date|string|number} dateInput 需要格式化的时间
     * @param {string} pattern 输出格式
     * @returns {string}
     */
    static format(dateInput, pattern = 'yyyy-MM-dd HH:mm:ss') {
        const date = dateInput instanceof Date ? dateInput : new Date(dateInput);
        if (Number.isNaN(date.getTime())) {
            throw new Error('无法格式化非法时间，请检查传入的时间值');
        }
        const replacers = {
            'yyyy': date.getFullYear().toString(),
            'MM': DateUtil.pad(date.getMonth() + 1),
            'dd': DateUtil.pad(date.getDate()),
            'HH': DateUtil.pad(date.getHours()),
            'mm': DateUtil.pad(date.getMinutes()),
            'ss': DateUtil.pad(date.getSeconds()),
            'SSS': date.getMilliseconds().toString().padStart(3, '0')
        };
        return pattern.replace(/yyyy|MM|dd|HH|mm|ss|SSS/g, (token) => replacers[token] ?? token);
    }

    /**
     * 获取当前时间（时分秒）
     * 格式: HH:mm:ss
     * @returns {string} 当前时间字符串
     * @example
     * TimeUtil.now(); // "14:32:18"
     */
    static nowTime() {
        const now = new Date();
        return `${this.pad(now.getHours())}:${this.pad(now.getMinutes())}:${this.pad(now.getSeconds())}`;
    }

    /**
     * 获取当前日期
     * 格式: yyyy-MM-dd
     * @returns {string} 当前日期字符串
     * @example
     * TimeUtil.today(); // "2025-09-09"
     */
    static today() {
        const now = new Date();
        return `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())}`;
    }

    /**
     * 获取当前日期和时间
     * 格式: yyyy-MM-dd HH:mm:ss
     * @returns {string} 当前完整时间字符串
     * @example
     * TimeUtil.nowFull(); // "2025-09-09 14:32:18"
     */
    static nowFull() {
        const now = new Date();
        return `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())} ${this.pad(now.getHours())}:${this.pad(now.getMinutes())}:${this.pad(now.getSeconds())}`;
    }


    /**
     * 解析带微秒的时间字符串，返回 HH:mm:ss
     * @param {string} datetimeStr 时间字符串，例如 "2025-09-10 16:55:10.135660"
     * @returns {string} 格式化后的时间 "HH:mm:ss"
     * @example
     * DateTimeUtil.parseToTime("2025-09-10 16:55:10.135660");
     * // => "16:55:10"
     */
    static parseToTime(datetimeStr) {
        // 用空格分割，取后半部分（时间部分）
        const timePart = datetimeStr.split(" ")[1];
        if (!timePart) return "";

        // 去掉小数秒部分
        return timePart.split(".")[0];
    }
    /**
     * 解析带微秒的时间字符串，返回 HH:mm:ss
     * @param {string} datetimeStr 时间字符串，例如 "2025-09-10 16:55:10.135660"
     * @returns {string} 格式化后的时间 "HH:mm:ss"
     * @example
     * DateTimeUtil.parseToTime("2025-09-10 16:55:10.135660");
     * // => "16:55:10"
     */
    static parseToTimeV2(datetimeStr) {
        // 用空格分割，取后半部分（时间部分）
        const timePart = datetimeStr.split("T")[1];
        if (!timePart) return "";

        // 去掉小数秒部分
        return timePart.split(".")[0];
    }

    /**
     * 计算两个时间字符串的时间差（秒，四舍五入）
     * 支持格式：yyyy-MM-dd HH:mm:ss.SSSSSS
     * @param {string} startStr 开始时间，例如 "2025-09-10 16:55:10.135660"
     * @param {string} endStr 结束时间，例如 "2025-09-10 16:56:12.987654"
     * @returns {number} 时间差（秒，整数）
     * @example
     * DateTimeUtil.diffInSeconds("2025-09-10 16:55:10.135660", "2025-09-10 16:56:12.987654");
     * // => 63
     */
    static diffInSeconds(startStr, endStr) {
        const parseToDate = (str) => {
            // 拆分日期和时间部分
            const [datePart, timePart] = str.split(" ");
            const [hms, micro] = timePart.split(".");
            // 取微秒的前3位，转成毫秒
            const ms = micro ? micro.substring(0, 3) : "000";
            return new Date(`${datePart}T${hms}.${ms}Z`);
        };

        const start = parseToDate(startStr).getTime();
        const end = parseToDate(endStr).getTime();

        // 毫秒差值 → 秒，四舍五入
        return Math.round((end - start) / 1000);
    }
    /**
     * 计算两个时间字符串的时间差（秒，四舍五入）
     * 支持格式：yyyy-MM-dd HH:mm:ss.SSSSSS
     * @param {string} startStr 开始时间，例如 "2025-09-10 16:55:10.135660"
     * @param {string} endStr 结束时间，例如 "2025-09-10 16:56:12.987654"
     * @returns {number} 时间差（秒，整数）
     * @example
     * DateTimeUtil.diffInSeconds("2025-09-10 16:55:10.135660", "2025-09-10 16:56:12.987654");
     * // => 63
     */
    static diffInSecondsV2(startStr, endStr) {
        const parseToDate = (str) => {
            // 拆分日期和时间部分
            const [datePart, timePart] = str.split("T");
            const [hms, micro] = timePart.split(".");
            // 取微秒的前3位，转成毫秒
            const ms = micro ? micro.substring(0, 3) : "000";
            return new Date(`${datePart}T${hms}.${ms}Z`);
        };

        const start = parseToDate(startStr).getTime();
        const end = parseToDate(endStr).getTime();

        // 毫秒差值 → 秒，四舍五入
        return Math.round((end - start) / 1000);
    }
}
